package com.zxl.readsms;

import android.database.ContentObserver;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

import androidx.annotation.Nullable;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 类说明：监听短信有两种方式：第一通过接受系统短息广播;第二监听短信数据库
 * 本类是用来观察系统里短信收件箱的数据库的变化，只要短信收件箱数据库发生变化，就会触发该类。
 *
 * @author fuyn
 * @date 2015-7-20
 * @version 1.0.0
 */
public class SMSContentObserver extends ContentObserver {
    private static final int MSG_INBOX = 1;
    private String  lastUri="";
    private Handler mHandler; // 更新UI线程
    private SimpleDateFormat sdf=new SimpleDateFormat("MM-dd HH:mm:ss");
    public SMSContentObserver(Handler mHandler) {
        super(mHandler); // 所有ContentObserver的派生类都需要调用该构造方法
        this.mHandler = mHandler;
    }

    /**
     * 当观察到的Uri发生变化时，回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑
     * selfChange:回调后，其值一般为false，该参数意义不大
     */
    @Override
    public void onChange(boolean selfChange, @Nullable Uri uri) {
        super.onChange(selfChange, uri);
        long current=System.currentTimeMillis();
        String brand = Build.MANUFACTURER;
        String uuu=uri.toString();
        if (isInsertSMS(uuu)){
            String end=uuu.substring(uuu.lastIndexOf("/")+1);
            UtilKt.log( brand+"   "+sdf.format(new Date(current)));
            if (end.equals(lastUri)){
                UtilKt.log( "id和上次重复跳过");
                return;
            }
            UtilKt.log( "短信id是:"+end );
            lastUri=end;
            Message m =new Message();
            m.what=MSG_INBOX;
            m.obj=end;
            mHandler.sendMessageDelayed(m,1500);
            return;
        }
    }

    private boolean isInsertSMS(String url) {
        if (url.isEmpty()) return false ;
        String pattern = "content://sms(/inbox)?/\\d*";
        Pattern r = Pattern.compile(pattern);
        Matcher m = r.matcher(url);
        return m.matches();
    }
}